package com.xinggq.pay.service.pay.channel.yse.enums;

import com.xinggq.pay.api.enums.YsePayWayEnum;
import com.xinggq.pay.service.pay.channel.PayChannelPayApiService;
import com.xinggq.pay.service.pay.channel.yse.pay.desk.YseDeskPayServiceImpl;
import com.xinggq.pay.service.pay.channel.yse.pay.qrpay.YseQrPayServiceImpl;
import com.xinggq.pay.service.pay.channel.yse.pay.wxpay.YseWxPayServiceImpl;
import com.xinggq.pay.service.context.SpringContextHolder;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 银盛方式枚举
 * @Description
 * @Author xinggq
 * @Date 2025/9/9
 */
@Getter
@AllArgsConstructor
public enum YsePayWayBindEnum {
  //
  ///**
  // * 分账退款
  // */
  //REFUND_SPLIT("refundSplit", YseMethodEnum.REFUND_SPLIT, "银盛退款", ""),
  //
  ///**
  // * 线上分账登记
  // */
  //DIVISION("division", YseMethodEnum.DIVISION, "线上分账登记", ""),

  //**********************************以下为银盛支付方式*******************************************/

  /**
   * B2B&B2C收银台支付
   */
  YSE_PAY_DESK(YsePayWayEnum.YSE_PAY_DESK, YseDeskPayServiceImpl.class, "银盛B2B&B2C收银台支付",
      ""),
  //**
  // * WAP网站支付页面接入
  // */
  //WAP("wap", YseWapPayServiceImpl.class, "WAP网站支付页面接入", ""),
  /**
   * 招商银行扫码
   */
  YSE_CMB(YsePayWayEnum.YSE_CMB, YseQrPayServiceImpl.class, "招商银行扫码", "3085840"),
  /**
   * 银联扫码
   */
  YSE_UNION_PAY(YsePayWayEnum.YSE_UNION_PAY, YseQrPayServiceImpl.class, "银联扫码", "9001002"),
  /**
   * QQ扫码
   */
  YSE_QQ_QR(YsePayWayEnum.YSE_QQ_QR, YseQrPayServiceImpl.class, "QQ扫码", "1904000"),
  /**
   * 支付宝扫码
   */
  YSE_ALIPAY_PAY(YsePayWayEnum.YSE_ALIPAY_PAY, YseQrPayServiceImpl.class, "支付宝扫码", "1903000"),
  /**
   * 公众号支付
   */
  YSE_MP(YsePayWayEnum.YSE_MP, YseWxPayServiceImpl.class, "微信公众号扫码", "2"),
  /**
   * 小程序支付
   */
  YSE_MINI(YsePayWayEnum.YSE_MINI, YseWxPayServiceImpl.class, "微信小程序扫码", "1");

  /**
   * 方式代码
   */
  private final YsePayWayEnum payWayEnum;

  /**
   * 银盛支付服务实现
   */
  private final Class<? extends PayChannelPayApiService> ysePayService;

  /**
   * 方式名称
   */
  private final String name;
  /**
   * 银盛代码
   * 扫码支付时，这个值时yse接口里的bank_type，用于区分支付宝、QQ、招商、银联
   * 微信支付时，这个值时yse接口里的is_minipg,用于区分小程序和公众号
   */
  private final String yseCode;

  /**
   * 静态缓存Map，用于根据payWayEnum快速查找Service Class
   */
  private static final Map<YsePayWayEnum, Class<? extends PayChannelPayApiService>> SERVICE_CLASS_MAP = new ConcurrentHashMap<>();

  /**
   * 静态缓存Map，用于根据payWayEnum快速查找Service Bean实例
   */
  private static final Map<YsePayWayEnum, PayChannelPayApiService> SERVICE_BEAN_MAP = new ConcurrentHashMap<>();

  static {
    // 类初始化时将所有枚举实例放入Class Map中
    for (YsePayWayBindEnum enumValue : values()) {
      SERVICE_CLASS_MAP.put(enumValue.payWayEnum, enumValue.ysePayService);
    }
  }

  /**
   * 初始化Bean缓存（由Spring容器初始化完成后调用）
   */
  public static void initBeanCache() {
    if (!SpringContextHolder.isInitialized()) {
      return;
    }
    for (YsePayWayBindEnum enumValue : values()) {
      try {
        PayChannelPayApiService bean = SpringContextHolder.getBean(enumValue.ysePayService);
        SERVICE_BEAN_MAP.put(enumValue.payWayEnum, bean);
      } catch (Exception e) {
        // 忽略Bean获取失败的情况，可能是某些Bean未注册
      }
    }
  }

  /**
   * 根据payWayEnum获取Service Bean实例
   */
  public static PayChannelPayApiService getServiceBeanByPayWay(
      YsePayWayEnum payWayEnum) {
    if (payWayEnum == null) {
      throw new IllegalArgumentException("payWayEnum不能为空");
    }
    return SERVICE_BEAN_MAP.get(payWayEnum);
  }

  /**
   * 根据payWayEnum获取当前枚举实例
   */
  public static YsePayWayBindEnum getByPayWayEnum(YsePayWayEnum payWayEnum) {
    if (payWayEnum == null) {
      throw new IllegalArgumentException("payWayEnum不能为空");
    }
    for (YsePayWayBindEnum enumValue : values()) {
      if (enumValue.payWayEnum == payWayEnum) {
        return enumValue;
      }
    }
    return null;
  }

}
